﻿#region Using

using System;
using System.Collections.Generic;
using System.Linq;
using Vk.Methods.Users;

#endregion

namespace Vk.Methods.Messages
{
    /// <summary>
    ///     Информация о мультидиалоге
    /// </summary>
    public class ChatInfo
    {
        /// <summary>
        ///     Идентификатор пользователя, который является создателем беседы.
        /// </summary>
        public int? AdminId { get; set; }

        /// <summary>
        ///     Идентификатор
        /// </summary>
        public int? ChatId { get; set; }

        /// <summary>
        ///     Флаг, указывающий, что пользователь был исключен из беседы. Всегда содержит true.
        /// </summary>
        public bool? Kicked { get; set; }

        /// <summary>
        ///     Флаг, указывающий, что пользователь покинул беседу. Всегда содержит true.
        /// </summary>
        public bool? Left { get; set; }

        /// <summary>
        ///     URL изображения-обложки чата шириной 100px (если доступно).
        /// </summary>
        public string Photo100 { get; set; }

        /// <summary>
        ///     URL изображения-обложки чата шириной 200px (если доступно).
        /// </summary>
        public string Photo200 { get; set; }

        /// <summary>
        ///     URL изображения-обложки чата шириной 50px (если доступно).
        /// </summary>
        public string Photo50 { get; set; }

        /// <summary>
        ///     Настройки оповещений для диалога.
        /// </summary>
        public PushSettings PushSettings { get; set; }

        /// <summary>
        ///     Заголовок
        /// </summary>
        public string Title { get; set; }

        /// <summary>
        ///     Тип
        /// </summary>
        public string Type { get; set; }

        /// <summary>
        ///     Список профилей (если указано поле fields)
        /// </summary>
        public List<User> Users { get; set; }

        public ChatInfo(ApiNode node)
        {
            ChatId = node.Int("id");
            Title = node.String("title");
            Type = node.String("type");
            AdminId = node.Int("admin_id");
            PushSettings = node.Object("push_settings", x => new PushSettings(x));
            Photo50 = node.String("photo_50");
            Photo100 = node.String("photo_100");
            Photo200 = node.String("photo_200");

            Left = node.Bool("left");
            Kicked = node.Bool("kicked");

            var userNodes = node.SelectNode("users")?.ChildNodes;
            if (userNodes == null)
                return;

            var isFullEntity = userNodes.First().ChildNodes.Any();
            Users = isFullEntity
                        ? userNodes.Select(x => new User(x)).ToList()
                        : userNodes.Select(x => x.Int())
                                   .Where(x => x.HasValue)
                                   .Select(x => new User(x.Value))
                                   .ToList();
        }
    }

    /// <summary>
    ///     Настройки оповещений для диалога
    /// </summary>
    public class PushSettings
    {
        /// <summary>
        ///     Указывает, до какого времени оповещения для чата отключены. default(DateTime) — отключены навсегда (бессрочно).
        /// </summary>
        public DateTime? DisabledUntil { get; set; }

        /// <summary>
        ///     Указывает, включен ли звук оповещений (true — включен, false — отключен);
        /// </summary>
        public bool? Sound { get; set; }

        public PushSettings(ApiNode node)
        {
            Sound = node.Bool("sound");
            DisabledUntil = node.Int("disabled_until") == -1
                                ? default(DateTime)
                                : node.DateTime("disabled_until");
        }
    }
}